package Thread_.homework;

//饿汉式
class MySingle{
    //创建私有 静态的 类对象，并实例化对象
    private  static MySingle single=new MySingle();
    //将构造器私有化
    private MySingle(){}
    //提供公共方法，返回创建的类对象
    public static MySingle getInstance(){
        return single;
    }
}
//懒汉式 线程不安全的
class MySingleLazy{
    //创建私有 静态的 类对象，先将其设为null
    private static MySingleLazy single=null;
    private MySingleLazy(){}
    public static MySingleLazy getInstance(){
        if(single==null){
           single=new MySingleLazy();
        }
        return single;
    }
}
//懒汉式 线程安全的
class MySingleLazy1{
    //创建私有 静态的 类对象，先将其设为null
    //防止在创建第一个类对象的时候，指令重排序， 给single加 volatile修饰
    private static volatile MySingleLazy1 single=null;
    private MySingleLazy1(){}

    public static MySingleLazy1 getInstance(){
        Object locker=new Object();
        if(single==null){//用于 提高代码效率
            synchronized(locker){//将判断和创建类对象，打包成一个原子的
                while(single==null){
                    single=new MySingleLazy1();
                }
            }
        }
        return single;
    }
}
public class test14 {
    //编写代码, 实现 线程安全版本的 单例模式
    public static void main1(String[] args) {
        MySingleLazy1 lazy1 = MySingleLazy1.getInstance();
        MySingleLazy1 lazy2 = MySingleLazy1.getInstance();
        System.out.println(lazy1==lazy2);

        MySingleLazy lazy3 = MySingleLazy.getInstance();
        MySingleLazy lazy4 = MySingleLazy.getInstance();
        System.out.println(lazy3==lazy4);

        MySingle lazy5 = MySingle.getInstance();
        MySingle lazy6 = MySingle.getInstance();
        System.out.println(lazy5==lazy6);


    }
}
